package com.cloudbroker.bcs.common.event.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.cloudbroker.bcs.common.event.BasicEvent;

/**
 * 用于标记自动发布事件的方法，该方法的返回值将会作为事件的payload
 * @author zhaohc
 *
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Trigger {
    
    /**
     * 事件名称
     * @return
     */
    String value() default "";
    
    /**
     * 事件名称（如果出现，覆盖{@link #value}）
     * @return
     */
    String eventName() default "";
    
    /**
     * 事件类
     * @return
     */
    Class<? extends BasicEvent> eventClass() default BasicEvent.class;
    
    /**
     * 是否异步通知
     * <ol>
     * <li>如果该方法同时有{@link org.springframework.scheduling.annotation.Async}注解，则以其为准，表示将会进行异步通知</li>
     * <li>默认值为{@code false}，即同步通知</li>
     * </ol>
     * @return
     */
    boolean async() default false;
    
    /**
     * 需要复制上下文的变量的key<br />
     * 变量存储于{@link com.cloudbroker.bcs.common.context.DataContext}<br />
     * 只有需要被异步通知时（会更换线程）才会发生上下文变量复制
     * @return
     */
    String[] penetratedContextKeys() default {};
    
}
